#!/usr/local/bin/python3
# -*- coding: utf-8 -*-

"""
@File    : user.py
@Author  : lepal
@Time    : 2024-02-29 17:16
"""
from flask import jsonify, g

from app.libs.ApiResponse import ApiResponse
# from flask import Blueprint
from app.libs.RedPrint import RedPrint
from app.libs.error_code import NotFound, DeleteSuccess, Success
from app.libs.token_auth import auth
from app.models.base import db

from app.models.user import User

# user = Blueprint('user', '__main__')
api = RedPrint('user')


# @app.route('/'), 因为app核心对象在入口文件中，如果把入口文件的app对象在当前导入会导致循环导入，所以使用蓝图解决
@api.route('/get/<int:uid>')
@auth.login_required
def get_user_by_uid(uid):

    # 根据id获取user对象，然后返回
    # user  = User.query.get(uid)
    # if user is None:
    #     raise NotFound(msg='user not found')

    # 上面3行可以写成一样， 但是错误的描述信息默认是The requested URL was not found on the server， 也可以重写get_or_404方法。
    # 重写方式见： app/models/base.py中的 get_or_404
    user = User.query.get_or_404(uid)
    # print("user",user,user.keys())
    # print("user",user.model_to_dict())
    # user.hide('id')

    return user.model_to_dict(exclude = ['password','create_time','status'])
    # return JsonResponse.success({"a":1})


    # users = User.query.all()
    # return jsonify(users)



# 根据token获取user信息
@api.route('/get')
@auth.login_required
def get_user_by_token():
    user = User.query.get_or_404(g.user.uid)
    data = user.model_to_dict(exclude = ['password'])
    data['scope'] = 'AdminScope' if user.auth == 2 else 'UserScope'  # auth =2 代表管理员; auth =1 代表普通用户
    return ApiResponse.success(data)


# 删除用户
@api.route('/delete/<int:uid>', methods=['GET','POST'])
@auth.login_required  # 这个验证@auth.verify_password 的g变量缓存了 user对象，他们是同一个请求，通过g变量可以拿到user的scope判断是否有删除权限
def delete_user(uid):
    # print('g.uid', g.user.uid) 可以从g变量获取uid，就不需要从路由中获取uid参数了，g变量缓存的user是从token解码出的
    with db.auto_commit():
        user = User.query.filter_by(id=uid).first_or_404()
        user.delete()
    return DeleteSuccess()
